﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UsersForms
{
    /*温馨提示：
     * 如果你记不清楚SqlConnection、SqlCommand、SqlDataAdapter、DataTable等完整的单词怎么写的话，
     * 就要添加“using System.Data;”“using System.Data.SqlClient;”这两个命名空间，不加的话就没有代码提示
     * 当然你能记住单词也是可以的，这要看你怎么来记
     * 下面的代码已经很简洁，不能再少了，很多地方也可以套用，可以说是固定的
         */
    class DBHelper
    {
        /*还有一点，我怕你忘了，我这里再提一下，
         * 1.private这个私有的，为什么要定义私有的，我们要包装一个可以操作数据库的类，而下面两个成员，
         * 只是提供给我们内部使用，然后我们又不希望外部访问
         * 2.static静态的，这是一个修饰符，这里又为什么定义为静态的，不定义行不行。
         * 那我这样给你解释，我们这个类不是定义两个方法，也是静态的，这样做是为了等下我们用的时候更方便，
         * 只是用起来更方便，所以使用static修饰符。
         * 最后这里为什么也要使用static，就是因为我们定义的两个的方法被static修饰了，是静态方法，
         * 被static修饰成为静态的方法只能调用静态的成员变量，所以必须加上，不然我们访问不了
         * 3.readonly修饰符是只读，因为我们不想下面两个不能修改，所以加上的，不加也可以，只是加上了会更优雅一些
         */
        private static readonly string connstr = "server=.;database=ShoolMessage;user=sa;pwd=123456";//这个是连接字符串，为我们提供连接数据库所需的信息，比如你的数据库用户名、密码等，说道这你应该懂了吧

        private static readonly SqlConnection myconn = new SqlConnection(connstr);//这步是创建连接对象，然后把上一步的连接字符串放进去，创建好了之后我们就可以操作我们本地的数据库


        /// <summary>
        /// 查找数据
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static DataTable Select(string sql)//这个参数是等下调用Select()这个方法的时候传进来的查询语句，select * from 表
        {
            /*
                  这个是进行有关查询的操作的方法，我不知道你能不能全部理解。
                  我先和你说一下思路：我们知道实现查询有两种方法，可现在是做项目，肯定是挑简单的，
                  所以我选择的是使用SqlDataAdapter的方法。

                  还有为什么返回值是DataTable，我现在只能说等下使用起来会比较方便，等下用的时候你知道了
               */
            myconn.Open();//第一步打开数据库

            SqlDataAdapter dataAdapter = new SqlDataAdapter(sql, myconn);//创建SqlDataAdapter的一个对象，干什么用的呢？就是我们不是已经打开了数据库吗，打开那我们就是要用的，这个就是我们要查询数据所必须的一个对象，作用嘛就相当于一个桥梁，为我们下一步提供条件

            DataTable myTable = new DataTable();//数据库的数据不是都是在一张张表中的吗，然后new一个DataTable，你可以想象为在数据库中建表

            dataAdapter.Fill(myTable);//刚刚不是提到了桥梁SqlDataAdapter吗，把数据比作人，数据从桥梁上过来之后就存储在刚刚建的表中

            myconn.Close();//然后关闭资源，你也可以不写，对于现阶段的我们影响不大

            return myTable;//最后把有数据的表返回出去，具体怎么用，等用到的时间在说

  

        }



        /// <summary>
        /// 添加数据、删除数据、更改数据
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        /// 
        public static int DeleteUpdateInsert(string sql)//这个参数是等下调用DeleteUpdateInsert()这个方法的时候传进来的除查询语句之外的SQL语句
        {
            myconn.Open();//第一步打开数据库

            SqlCommand mycomm = new SqlCommand(sql, myconn);//这个和上面new的一个SqlDataAdapter(类似桥梁)有点像，SqlCommand这个对象是执行我们传进来的sql语句

            var i = mycomm.ExecuteNonQuery();//然后调用实现添加数据、删除数据、更改数据共用的一个方法，它会返回一个整数，告诉我们改变了多少行，和在数据库我们插入数据的时候，最后不是会提示我们影响了多少行是一样的

            myconn.Close();//关闭资源

            return i;//根据返回的影响的行数，我们就知道有没有发生改变
        }
    }
}
